home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
CRS
/
crs49.d81
/
hack7a.sfx
/
hack#7b.txt
< prev
Wrap
Text File
|
1990-02-12
|
40KB
|
909 lines
├000 ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ -
-----------------------------------------------------------------------------
┬000
┬┴╙╔├ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ┬┴╙╔├ ╥╧═╚ ╥╧═╚ -
┴000
-----------------------------------------------------------------------------
9000
╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥╧═╠ ╥┴═ ╥╧═╠ ╥╧═╠(*
8000
-----------------------------------------------------------------------------
7000
6000
╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ -
5000
4000
-----------------------------------------------------------------------------
3000
2000 ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ -
1000
-----------------------------------------------------------------------------
0000 ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═ ╥┴═
-----------------------------------------------------------------------------
*) ╔NTERNAL MEMORY DOES NOT RESPOND TO WRITE ACCESSES TO THESE AREAS.
╠EGEND: ╦ERNAL ┼000-╞╞╞╞ ╦ERNAL ╥╧═.
╔╧/├ ─000-─╞╞╞ ╔/╧ ADDRESS SPACE OR ├HARACTER
GENERATOR ╥╧═, SELECTED BY -├╚┴╥┼╬.
╔F THE ├╚┴╥┼╬ BIT IS CLEAR,
THE CHARACTER GENERATOR ╥╧═ IS
CHOSEN. ╔F IT IS SET, THE
╔/╧ CHIPS ARE ACCESSIBLE.
╔╧/╥┴═ ─000-─╞╞╞ ╔/╧ ADDRESS SPACE OR ╥┴═,
SELECTED BY -├╚┴╥┼╬.
╔F THE ├╚┴╥┼╬ BIT IS CLEAR,
THE CHARACTER GENERATOR ╥╧═ IS
CHOSEN. ╔F IT IS SET, THE
INTERNAL ╥┴═ IS ACCESSIBLE.
╔/╧ ─000-─╞╞╞ ╔/╧ ADDRESS SPACE.
╘HE -├╚┴╥┼╬ LINE HAS NO EFFECT.
┬┴╙╔├ ┴000-┬╞╞╞ ┬┴╙╔├ ╥╧═.
╥╧═╚ ┴000-┬╞╞╞ OR ┼XTERNAL ╥╧═ WITH THE -╥╧═╚ LINE
┼000-╞╞╞╞ CONNECTED TO ITS -├╙ LINE.
╥╧═╠ 8000-9╞╞╞ ┼XTERNAL ╥╧═ WITH THE -╥╧═╠ LINE
CONNECTED TO ITS -├╙ LINE.
╥┴═ VARIOUS RANGES ├OMMODORE 64'S INTERNAL ╥┴═.
- 1000-7╞╞╞ AND ╧PEN ADDRESS SPACE.
┴000-├╞╞╞ ╘HE ├OMMODORE 64'S MEMORY CHIPS
DO NOT DETECT ANY MEMORY ACCESSES
TO THIS AREA EXCEPT THE ╓╔├-╔╔'S
─═┴ AND MEMORY REFRESHES.
╬╧╘┼: ╫HENEVER THE PROCESSOR TRIES TO WRITE TO ANY ╥╧═ AREA
(╦ERNAL, ┬┴╙╔├, ├╚┴╥╧═, ╥╧═╠, ╥╧═╚), THE DATA WILL GET
"THROUGH THE ╥╧═" TO THE ├64'S INTERNAL ╥┴═.
╞OR THIS REASON, YOU CAN EASILY COPY DATA FROM ╥╧═ TO ╥┴═,
WITHOUT ANY BANK SWITCHING. ┬UT IMPLEMENTING EXTERNAL
MEMORY EXPANSIONS WITHOUT ─═┴ IS VERY HARD, AS YOU HAVE TO
USE THE ╒LTIMAX MEMORY CONFIGURATION, OR THE DATA WILL BE
WRITTEN BOTH TO INTERNAL AND EXTERNAL ╥┴═.
╚OWEVER, THIS IS NOT TRUE FOR THE ╒LTIMAX GAME
CONFIGURATION. ╔N THAT MODE, THE INTERNAL ╥┴═ IGNORES ALL
MEMORY ACCESSES OUTSIDE THE AREA $0000-$0╞╞╞, UNLESS THEY ARE
PERFORMED BY THE ╓╔├, AND YOU CAN WRITE TO EXTERNAL MEMORY
AT $1000-$├╞╞╞ AND $┼000-$╞╞╞╞, IF ANY, WITHOUT CHANGING
THE CONTENTS OF THE INTERNAL ╥┴═.
_┴ NOTE CONCERNING THE ╔/╧ AREA_
╘HE ╔/╧ AREA IS DIVIDED AS FOLLOWS:
┴DDRESS RANGE ╧WNER
------------- -----
─000-─3╞╞ ═╧╙ 6567/6569 ╓╔├-╔╔ ╓IDEO ╔NTERFACE ├ONTROLLER
─400-─7╞╞ ═╧╙ 6581 ╙╔─ ╙OUND ╔NTERFACE ─EVICE
─800-─┬╞╞ ├OLOR ╥┴═ (ONLY LOWER NYBBLES ARE CONNECTED)
─├00-─├╞╞ ═╧╙ 6526 ├╔┴ ├OMPLEX ╔NTERFACE ┴DAPTER #1
──00-──╞╞ ═╧╙ 6526 ├╔┴ ├OMPLEX ╔NTERFACE ┴DAPTER #2
─┼00-─┼╞╞ ╒SER EXPANSION #1 (-╔/╧1 ON ┼XPANSION ╨ORT)
─╞00-─╞╞╞ ╒SER EXPANSION #2 (-╔/╧2 ON ┼XPANSION ╨ORT)
┴S YOU CAN SEE, THE ADDRESS RANGES FOR THE CHIPS ARE MUCH LARGER
THAN REQUIRED. ┬ECAUSE OF THIS, YOU CAN ACCESS THE CHIPS THROUGH
MULTIPLE MEMORY AREAS. ╘HE ╓╔├-╔╔ APPEARS IN ITS WINDOW EVERY $40
ADDRESSES. ╞OR INSTANCE, THE ADDRESSES $─040 AND $─080 ARE BOTH MAPPED
TO THE ╙PRITE 0 ╪ CO-ORDINATE REGISTER. ╘HE ╙╔─ HAS ONE REGISTER
SELECTION LINE LESS, THUS IT APPEARS AT EVERY $20 BYTES. ╘HE ├╔┴
CHIPS HAVE ONLY 16 REGISTERS, SO THERE ARE 16 COPIES OF EACH IN THEIR
MEMORY AREA.
╚OWEVER, YOU SHOULD NOT USE OTHER ADDRESSES THAN THOSE SPECIFIED BY
├OMMODORE. ╞OR INSTANCE, THE ├OMMODORE 128 MAPPED ITS ADDITIONAL ╔/╧
CHIPS TO THIS SAME MEMORY AREA, AND THE ╙╔─ RESPONDS ONLY TO THE
ADDRESSES ─400-─4╞╞, ALSO WHEN IN ├64 MODE. ┴ND THE ├OMMODORE 65,
WHICH UNFORTUNATELY DID NOT MAKE ITS WAY TO THE MARKET, COULD NARROW
THE MEMORY WINDOW RESERVED FOR THE ═╧╙ 6569/6567 ╓╔├-╔╔ (OR ├╙╟ 4567
╓╔├-╔╔╔ IN THAT MACHINE).
_╘HE VIDEO CHIP_
╘HE ═╧╙ 6567/6569 ╓╔├-╔╔ ╓IDEO ╔NTERFACE ├ONTROLLER HAS ACCESS TO
ONLY 16 KILOBYTES AT A TIME. ╘O ENABLE THE ╓╔├-╔╔ TO ACCESS THE WHOLE
64 K┬ MEMORY SPACE, THE MAIN MEMORY IS DIVIDED TO FOUR BANKS OF 16 K┬
EACH. ╘HE LINES ╨┴0 AND ╨┴1 OF THE SECOND ├╔┴ ARE THE INVERSE OF THE
VIRTUAL ╓╔├-╔╔ ADDRESS LINES ╓┴14 AND ╓┴15, RESPECTIVELY. ╘O SELECT A
╓╔├-╔╔ BANK OTHER THAN THE DEFAULT, YOU MUST PROGRAM THE ├╔┴ LINES TO
OUTPUT THE DESIRED BIT PAIR. ╞OR INSTANCE, THE FOLLOWING CODE SELECTS
THE MEMORY AREA $4000-$7╞╞╞ (BANK 1) FOR THE VIDEO CONTROLLER:
╠─┴ $──02 ; ─ATA ─IRECTION ╥EGISTER ┴
╧╥┴ #$03 ; ╙ET PINS ╨┴0 AND ╨┴1 TO OUTPUTS
╙╘┴ $──02
╠─┴ $──00
┴╬─ #$╞├ ; ═ASK THE LOWMOST BIT PAIR OFF
╧╥┴ #$02 ; ╙ELECT ╓╔├-╔╔ BANK 1 (THE INVERSE OF BINARY 01 IS 10)
╙╘┴ $──00
╫HY SHOULD YOU SET THE PINS TO OUTPUTS? ╚ARDWARE ╥┼╙┼╘ RESETS ALL
╔/╧ LINES TO INPUTS, AND THANKS TO THE ├╔┴'S INTERNAL PULL-UP
RESISTORS, THE INPUTS ACTUALLY OUTPUT LOGICAL HIGH VOLTAGE LEVEL. ╙O,
UPON -╥┼╙┼╘, THE VIDEO BANK 0 IS SELECTED AUTOMATICALLY, AND OLDER
╦ERNALS COULD LEAVE IT UNINITIALIZED.
╬OTE THAT THE ╓╔├-╔╔ ALWAYS FETCHES ITS INFORMATION FROM THE
INTERNAL ╥┴═, TOTALLY IGNORING THE MEMORY CONFIGURATION LINES. ╘HERE
IS ONLY ONE EXCEPTION TO THIS RULE: ╘HE CHARACTER GENERATOR ╥╧═.
╒NLESS THE ╒LTIMAX MODE IS SELECTED, ╓╔├-╔╔ "SEES" CHARACTER GENERATOR
╥╧═ IN THE MEMORY AREAS 1000-1╞╞╞ AND 9000-9╞╞╞. ╔F THE ╒LTIMAX
CONFIGURATION IS ACTIVE, THE ╓╔├-╔╔ WILL FETCH ALL DATA FROM THE
INTERNAL ╥┴═.
_┴N APPLICATION: ═AKING AN OPERATING SYSTEM EXTENSION_
╔F YOU ARE MAKING A MEMORY RESIDENT PROGRAM AND WANT TO MAKE IT AS
INVISIBLE TO THE SYSTEM AS POSSIBLE, PROBABLY THE BEST METHOD IS
KEEPING MOST OF YOUR CODE UNDER THE ╔/╧ AREA (IN THE ╥┴═ AT
$─000-$─╞╞╞). ╘HIS AREA IS VERY SAFE, SINCE PROGRAMS UTILIZING IT ARE
RARE, SINCE THEY ARE VERY DIFFICULT TO IMPLEMENT AND TO DEBUG. ┘OU
NEED ONLY A SHORT ROUTINE IN THE NORMALLY VISIBLE ╥┴═ THAT PUSHES THE
CURRENT VALUE OF THE PROCESSOR'S ╔/╧ REGISTER $01 ON STACK, SWITCHES
╥┴═ ON TO $─000-$─╞╞╞ AND JUMPS TO THIS AREA. ╥ETURNING FROM THE
$─000-$─╞╞╞ AREA IS POSSIBLE EVEN WITHOUT ANY ROUTINE IN THE NORMALLY
VISIBLE ╥┴═ AREA. ╩UST WRITE AN ╥╘╙ OR AN ╥╘╔ TO AN ╔/╧ REGISTER AND
RETURN THROUGH IT.
┬UT WHAT IF YOUR PROGRAM NEEDS TO USE ╔/╧? ┴ND HOW CAN YOU WRITE THE
RETURN INSTRUCTION TO AN ╔/╧ REGISTER WHILE THE ╔/╧ AREA IS SWITCHED
OFF? ┘OU NEED A SWAP AREA FOR YOUR PROGRAM IN NORMALLY VISIBLE MEMORY.
╘HE FIRST THING YOUR ROUTINE AT $─000-$─╞╞╞ DOES IS COPYING THE ╔/╧
ROUTINES (OR THE WHOLE PROGRAM) TO NORMALLY VISIBLE MEMORY, SWAPPING
THE BYTES. ╞OR INSTANCE, IF YOUR ╔/╧ ROUTINES ARE INITIALLY BEING
STORED AT $─200-$─3╞╞, EXCHANGE THE BYTES IN $─200-$─3╞╞ WITH THE
CONTENTS OF $├000-$├1╞╞. ╬OW YOU CAN CALL THE ╔/╧ ROUTINES FROM YOUR
ROUTINE AT $─000-$─╞╞╞, AND THE ╔/╧ ROUTINES CAN SWITCH THE ╔/╧ AREA
TEMPORARILY ON TO ACCESS THE ╔/╧ CHIPS. ┴ND RIGHT BEFORE EXITING YOUR
PROGRAM AT $─000-$─╞╞╞ SWAPS THE OLD CONTENTS OF THAT ╔/╧ ROUTINE AREA
IN, E.G. EXCHANGES THE MEMORY AREAS $─200-$─3╞╞ AND $├000-$├1╞╞
AGAIN.
╫HAT ╔/╧ REGISTERS CAN YOU USE FOR THE RETURN INSTRUCTION? ╘HERE ARE
BASICALLY TWO ALTERNATIVES: 8-BIT ╓╔├ SPRITE REGISTERS OR EITHER ├╔┴'S
SERIAL PORT REGISTER. ╘HE ╓╔├ REGISTERS ARE EASIEST TO USE, AS THEY
ACT PRECISELY LIKE MEMORY PLACES: YOU CAN EASILY WRITE THE DESIRED
VALUE TO A REGISTER. ┬UT THE ├╔┴ REGISTER IS USUALLY BETTER, AS
CHANGING THE ╓╔├ REGISTERS MIGHT CHANGE THE SCREEN LAYOUT.
╚OWEVER, ALSO THE ╙╨ REGISTER HAS SOME DRAWBACKS: ╔F THE MACHINE'S
├╬╘1 AND ├╬╘2 LINES ARE CONNECTED TO A FREQUENCY SOURCE, YOU MUST STOP
EITHER ├╔┴'S ╘IMER ┴ TO USE THE ╙╨ REGISTER METHOD. ╬ORMALLY THE 1ST
├╔┴'S ╘IMER ┴ IS THE MAIN HARDWARE INTERRUPT SOURCE. ┴ND IF YOU USE
THE ╦ERNAL'S ╥╙232, YOU CANNOT STOP THE 2ND ├╔┴'S ╘IMER ┴ EITHER. ┴LSO,
IF YOU DON'T WANT TO LOSE ANY ├╔┴ INTERRUPTS, YOU MIGHT WANT TO KNOW
THAT EXECUTING THE ╥╘╙ OR ╥╘╔ AT ╙╨ REGISTER HAS THE SIDE EFFECT OF
READING THE ╔NTERRUPT ├ONTROL ╥EGISTER, THUS ACKNOWLEDGING AN INTERRUPT
THAT MIGHT HAVE BEEN WAITING.
╔F YOU CAN'T USE EITHER METHOD, YOU CAN USE EITHER ├╔┴'S ╘O─ SECONDS
OR MINUTES OR ╘O─ ALARM TIME FOR STORING AN ╥╘╔. ╧R, IF YOU DON'T WANT
TO ALTER ANY REGISTERS, USE THE ╓╔├-╔╔'S LIGHT PEN REGISTER. ┬EFORE
EXITING, WAIT FOR APPROPRIATE RASTER LINE AND TRIG THE LIGHT PEN LATCH
WITH ├╔┴1'S ╨┬4 BIT. ╚OWEVER, THIS METHOD ASSUMES THAT THE CONTROL
PORT 1'S BUTTON/LIGHT PEN LINE REMAINS UP FOR THAT FRAME. ┴FTER
TRIGGING THE LIGHT PEN, CAUSING THE LIGHT PEN ┘ CO-ORDINATE REGISTER
($─014) TO BE $40 OR $60, YOU HAVE MORE THAN HALF A FRAME TIME TO
RESTORE THE STATE OF THE ╔/╧ CHIPS AND RETURN THROUGH THE REGISTER.
┘OU CAN ALSO USE THE ╙╔─ TO STORE AN ╥╘╔ OR ╥╘╙ COMMAND. ╚OW IS THIS
POSSIBLE, YOU MIGHT ASK. ┴FTER ALL, THE CHIP CONSISTS OF READ ONLY OR
WRITE ONLY REGISTERS. ╚OWEVER, THERE ARE TWO REGISTERS THAT CAN BE
CONTROLLED BY PROGRAM, THE ENVELOPE GENERATOR AND OSCILLATOR OUTPUTS
OF THE THIRD VOICE. ╘HIS METHOD REQUIRES YOU TO CHANGE THE FREQUENCY
OF VOICE 3 AND TO SELECT A WAVEFORM FOR IT. ╘HIS WILL AFFECT ON THE
VOICE OUTPUT BY TURNING THE VOICE 3 OFF, BUT WHO WOULD KEEP THE VOICE
3 PRODUCING A TONE WHILE CALLING AN OPERATING SYSTEM ROUTINE?
┴LSO KEEP IN MIND THAT THE USER COULD PRESS ╥┼╙╘╧╥┼ WHILE THE ╦ERNAL
╥╧═ AND ╔/╧ AREAS ARE DISABLED. ┘OU COULD WRITE YOUR OWN NON-MASKABLE
INTERRUPT (╬═╔) HANDLER (USING THE ╬═╔ VECTOR AT $╞╞╞┴), BUT A FAST
LOADER THAT USES VERY TIGHT TIMING WOULD STILL STOP WORKING IF THE
USER PRESSED ╥┼╙╘╧╥┼ IN THE MIDDLE OF A DATA BLOCK TRANSFER. ╙O, TO
MAKE A ROBUST PROGRAM, YOU HAVE TO DISABLE ╬═╔ INTERRUPTS. ┬UT HOW IS
THIS POSSIBLE? ╘HEY ARE ╬ON-═ASKABLE AFTER ALL. ╘HE ╬═╔ INTERRUPT IS
EDGE-SENSITIVE, THE PROCESSOR JUMPS TO ╬═╔ HANDLER ONLY WHEN THE -╬═╔
LINE DROPS FROM +5╓ TO GROUND. ╘O DISABLE THE INTERRUPT, SIMPLY CAUSE
AN ╬═╔ WITH ├╔┴2'S TIMER, BUT DON'T READ THE ╔NTERRUPT ├ONTROL
REGISTER. ╔F YOU NEED TO READ $──0─ IN YOUR PROGRAM, YOU MUST ADD A
╬═╔ HANDLER JUST IN CASE THE USER PRESSES ╥┼╙╘╧╥┼. ┴ND DON'T FORGET TO
RAISE THE -╬═╔ LINE UPON EXITING THE PROGRAM. ╧THERWISE THE ╥┼╙╘╧╥┼
KEY DOES NOT WORK UNTIL THE USER ISSUES A -╥┼╙┼╘ OR READS THE ╔├╥
REGISTER EXPLICITLY. (╘HE ╦ERNAL DOES NOT READ $──0─, UNLESS IT IS
HANDLING AN INTERRUPT.) ╘HIS CAN BE DONE AUTOMATICALLY BY THE TWO
FOLLOWING ╙╨ REGISTER EXAMPLES DUE TO ONE OF THE 6510'S UNDOCUMENTED
FEATURES (REFER TO THE DESCRIPTIONS OF ╥╘╙ AND ╥╘╔ BELOW).
; ╥ETURNING VIA ╓╔├ SPRITE 7 ╪ CO-ORDINATE REGISTER
╔NITIALIZATION: ; ╘HIS IS EXECUTED WHEN ╔/╧ IS SWITCHED ON
╠─┴ #$60
╙╘┴ $─015 ; ╫RITE ╥╘╙ TO ╓╔├ REGISTER $15.
┼XITING: ; ╬╧╘┼: ╘HIS PROCEDURE MUST START AT ╓╔├ REGISTER
; $12. ┘OU HAVE MULTIPLE ALTERNATIVES, AS THE ╓╔├
; APPEARS IN MEMORY AT $─000+$40*N, WHERE $0<=N<=$╞.
╨╠┴ ; ╨ULL THE SAVED 6510 ╔/╧ REGISTER STATE FROM STACK
╙╘┴ $01 ; ╥ESTORE ORIGINAL MEMORY BANK CONFIGURATION
; ╬OW THE PROCESSOR FETCHES THE ╥╘╙ COMMAND FROM THE
; ╓╔├ REGISTER $15.
; ╥ETURNING VIA ├╔┴ 2'S ╘O─ OR ╘O─ ALARM SECONDS REGISTER
╔NITIALIZATION: ; ╘HIS IS EXECUTED WHEN ╔/╧ IS SWITCHED ON
╠─┴ #$40
╙╘┴ $──08 ; ╙ET ╘O─ TENTHS OF SECONDS
; (CLEAR IT SO THAT THE SECONDS REGISTER
; WOULD NOT OVERFLOW)
; ╔F ╘O─ ALARM REGISTER IS SELECTED, THIS
; INSTRUCTION WILL BE UNNECESSARY.
╙╘┴ $──09 ; ╙ET ╘O─ SECONDS
╠─┴ $──0┬ ; ╥EAD ╘O─ HOURS (FREEZE ╘O─ DISPLAY)
┼XITING: ; ╬╧╘┼: ╘HIS PROCEDURE MUST START AT ├╔┴ 2 REGISTER
; $6. ┴S THE ├╔┴ 2 APPEARS IN MEMORY AT $──00+$10*N,
; WHERE 0<=N<=$╞, YOU HAVE SIXTEEN ALTERNATIVES.
╨╠┴
╙╘┴ $01 ; ╥ESTORE ORIGINAL MEMORY BANK CONFIGURATION
; ╬OW THE PROCESSOR FETCHES THE ╥╘╙ COMMAND FROM
; THE ├╔┴ 2 REGISTER $9.
; ╥ETURNING VIA ├╔┴ 2'S ╙╨ REGISTER (ASSUMING THAT ├╬╘2 IS STABLE)
╔NITIALIZATION: ; ╘HIS IS EXECUTED WHEN ╔/╧ IS SWITCHED ON
╠─┴ $──0┼ ; ├╔┴ 2'S ├ONTROL ╥EGISTER ┴
┴╬─ #$┬╞ ; ╙ET ╙ERIAL ╨ORT TO INPUT
╙╘┴ $──0┼ ; (MAKE THE ╙╨ REGISTER TO ACT AS A MEMORY PLACE)
╠─┴ #$60
╙╘┴ $──0├ ; ╫RITE ╥╘╙ TO ├╔┴ 2 REGISTER $├.
┼XITING: ; ╬╧╘┼: ╘HIS PROCEDURE MUST START AT ├╔┴ 2 REGISTER
; $9. ┴S THE ├╔┴ 2 APPEARS IN MEMORY AT $──00+$10*N,
; WHERE 0<=N<=$╞, YOU HAVE SIXTEEN ALTERNATIVES.
╨╠┴
╙╘┴ $01 ; ╥ESTORE ORIGINAL MEMORY BANK CONFIGURATION
; ╬OW THE PROCESSOR FETCHES THE ╥╘╙ COMMAND FROM
; THE ├╔┴ 2 REGISTER $├.
; ╥ETURNING VIA ├╔┴ 2'S ╙╨ REGISTER, STOPPING THE ╘IMER ┴
; AND FORCING ╙╨2 AND ├╬╘2 TO OUTPUT
╔NITIALIZATION: ; ╘HIS IS EXECUTED WHEN ╔/╧ IS SWITCHED ON
╠─┴ $──0┼ ; ├╔┴ 2'S ├ONTROL ╥EGISTER ┴
┴╬─ #$╞┼ ; ╙TOP ╘IMER ┴
╧╥┴ #$40 ; ╙ET ╙ERIAL ╨ORT TO OUTPUT
╙╘┴ $──0┼ ; (MAKE THE ╙╨ REGISTER TO ACT AS A MEMORY PLACE)
╠─┴ #$60
╙╘┴ $──0├ ; ╫RITE ╥╘╙ TO ├╔┴ REGISTER $├.
┼XITING: ; ╬╧╘┼: ╘HIS PROCEDURE MUST START AT ├╔┴ 2 REGISTER
; $9. ┴S THE ├╔┴ 2 APPEARS IN MEMORY AT $──00+$10*N,
; WHERE 0<=N<=$╞, YOU HAVE SIXTEEN ALTERNATIVES.
╨╠┴
╙╘┴ $01 ; ╥ESTORE ORIGINAL MEMORY BANK CONFIGURATION
; ╬OW THE PROCESSOR FETCHES THE ╥╘╙ COMMAND FROM
; THE ├╔┴ 2 REGISTER $├.
; ╥ETURNING VIA ╙╔─ OSCILLATOR 3 OUTPUT REGISTER
╔NITIALIZATION: ; ╘HIS IS EXECUTED WHEN ╔/╧ IS SWITCHED ON
╠─┴ #$20 ; ╙ELECT SAWTOOTH WAVEFORM
╙╘┴ $─412 ; BUT DO NOT ENABLE THE SOUND
╠─┘ #$00 ; ╙ELECT FREQUENCY
╙╘┘ $─40┼ ; (SYSTEM CLOCK)/$╞╞00,
╠─┴ #$╞╞ ; CAUSING THE ╧╙├3 OUTPUT TO INCREMENT BY ONE
╙╘┘ $─40╞ ; EVERY $10000/$╞╞00 CYCLES.
╠─┴ #$0┼
╠─╪ #$60
┬╔╘ $─41┬ ; ╫AIT FOR THE OSCILLATOR 3 OUTPUT
┬═╔ *-3 ; TO BE IN THE RANGE
┬╓╙ *-5 ; $00-$3╞.
┬╔╘ $─41┬ ; ╫AIT FOR THE OSCILLATOR 3 OUTPUT
┬╓├ *-3 ; TO BE AT LEAST $40.
╙╘┴ $─40╞ ; ╙LOW DOWN THE FREQUENCY TO (SYSTEM CLOCK)/$0┼00.
├╨╪ $─41┬ ; ╫AIT FOR THE OSCILLATOR 3
┬╬┼ *-3 ; OUTPUT TO REACH $60 (╥╘╙)
╙╘┘ $─40╞ ; ╥ESET THE FREQUENCY OF VOICE 3
; (STOP THE ╧╙├3 REGISTER FROM INCREASING)
┼XITING: ; ╬╧╘┼: ╘HIS PROCEDURE MUST START AT ╙╔─ REGISTER
; $18. ┴S THE ╙╔─ APPEARS IN MEMORY AT $─400+$20*N,
; WHERE 0<=N<=$20, YOU HAVE THIRTY-TWO ALTERNATIVES.
; ╚OWEVER, IN ├128 THERE ARE ONLY EIGHT ALTERNATIVES,
; AS THE ╙╔─ IS ONLY AT $─400-$─4╞╞.
╨╠┴
╙╘┴ $01 ; ╥ESTORE ORIGINAL MEMORY BANK CONFIGURATION
; ╬OW THE PROCESSOR FETCHES THE ╥╘╙ COMMAND FROM
; THE ╙╔─ REGISTER $1┬.
╞OR INSTANCE, IF YOU WANT TO MAKE A HIGHLY COMPATIBLE FAST LOADER,
MAKE THE ╔╠╧┴─ VECTOR ($0330) POINT TO THE BEGINNING OF THE STACK
AREA. ╥EMEMBER THAT THE ┬┴╙╔├ INTERPRETER USES THE FIRST BYTES OF
STACK WHILE CONVERTING NUMBERS TO TEXT. ┴ GOOD ADDRESS IS $0120.
╥OBUST PROGRAMS PRACTICALLY NEVER USE SO MUCH STACK THAT IT COULD
CORRUPT THIS ROUTINE. ╒SUALLY ONLY CRUNCHED PROGRAMS (DEMOS AND ALIKE)
USE ALL STACK IN THE DECOMPRESSION PHASE. ╘HEY ALSO MAKE USE OF THE
$─000-$─╞╞╞ AREA.
╘HIS STACK ROUTINE WILL JUMP TO YOUR ROUTINE AT $─000-$─╞╞╞, AS
DESCRIBED ABOVE. ╞OR PERFORMANCE'S SAKE, COPY THE WHOLE BYTE TRANSFER
LOOP TO THE SWAP AREA, E.G. $├000-$├1╞╞, AND CALL THAT SUBROUTINE
AFTER DOING THE PRELIMINARY WORK. ┬UT WHAT ABOUT FILES THAT LOAD OVER
$├000-$├1╞╞? ╫OULDN'T THAT DESTROY THE TRANSFER LOOP AND JAM THE
MACHINE? ╬OT NECESSARILY. ╔F YOU COPY THOSE BYTES TO YOUR SWAP AREA AT
$─000-$─╞╞╞, THEY WILL BE LOADED PROPERLY, AS YOUR PROGRAM RESTORES
THE ORIGINAL $├000-$├1╞╞ AREA.
╔F YOU WANT TO MAKE YOUR PROGRAM USER-FRIENDLY, PUT A VECTOR
INITIALIZATION ROUTINE TO THE STACK AREA AS WELL, SO THAT THE USER CAN
RESTORE THE FAST LOADER BY ISSUING A ╙┘╙ COMMAND, RATHER THAN LOADING
IT EACH TIME HE HAS PRESSED ╥┼╙┼╘.
_┴N EXAMPLE: ┴ "HELLO WORLD" PROGRAM_
╘O HELP YOU IN GETTING STARTED, ╔ HAVE WRITTEN A SMALL EXAMPLE
PROGRAM THAT ECHOES THE FAMOUS MESSAGE "HELLO, WORLD!" TO STANDARD
OUTPUT (NORMALLY SCREEN) USING THE ╦ERNAL'S ├╚╥╧╒╘ SUBROUTINE. ┴FTER
THE INITIALIZATION ROUTINE HAS BEEN RUN, THE PROGRAM CAN BE STARTED BY
COMMANDING ╙┘╙ 300. ╔ USED THE ├OMMODORE 128'S MACHINE LANGUAGE
MONITOR TO PUT IT UP, BUT IT WAS STILL PRETTY DIFFICULT TO DEBUG THE
PROGRAM. ╚ERE IT IS IN UUENCODED FORMAT:
BEGIN 644 HELLO
═└0@+",─'╟├(╨-├$└└└!╪╔0%(*?┬%└:(,╧3└(╟2╨!╥┴#╫╚╚╬]/└┬=8]╫*╘/=╚
═┴0%88*4!╩┬╟╪"01╪┴0%,╔-╫╞└:*!├@╫=╚@".!=╫╚├@3=╚═╓.#═╓┬0(╪,╫<8!
═8*4!2└─#┴0&@#+─╙╨"#2_╪@0]╓┬%└6└┴1$╤23╒<@+$],3$5(┬─┬═^╧](╦?╧_
═2*─6├?╦_╩<"-^_\@╫-╘@└,!╚├?╧_:(╫┌_╥└=╨"#<╫6┬╚╩0!(╬╧╪"└=└#_@,!
5┴└&@/[╪└╨+┼─╫9─└╨(╩99-╓($/!@
└
END
╔N ORDER TO FULLY UNDERSTAND THE OPERATION OF THIS PROGRAM, YOU NEED
TO KNOW HOW THE INSTRUCTIONS ╥╘╔, ╥╘╙ AND ╨╚┴ WORK. ╘HERE IS SOME WORK
GOING ON TO REVERSE ENGINEER THE ╬═╧╙ 6502 MICROPROCESSOR TO LARGE
EXTENT, AND IT IS NOW KNOWN FOR MOST INSTRUCTIONS WHAT MEMORY PLACES
THEY ACCESS DURING THEIR EXECUTION AND FOR WHAT PURPOSE. ╘HE INTERNAL
PROCEDURES HAVEN'T BEEN DESCRIBED IN DETAIL YET, BUT THESE
DESCRIPTIONS SHOULD BE EASIER TO READ ANYWAY.
╞OR CURIOSITY, ╔ QUOTE HERE THE DESCRIPTION OF ALL INSTRUCTIONS THAT
USE THE STACK. ╘HE DESCRIPTIONS OF INTERNAL OPERATIONS ARE YET
INACCURATE, BUT THE MEMORY ACCESSES HAVE BEEN VERIFIED WITH AN
OSCILLOSCOPE. ╔ WILL MAIL COPIES THE WHOLE DOCUMENT UPON REQUEST. ╫HEN
FINISHED, THE DOCUMENT WILL BE PUT ON AN ╞╘╨ SITE.
╩╙╥
# ADDRESS ╥/╫ DESCRIPTION
--- ------- --- -------------------------------------------------
1 ╨├ ╥ FETCH OPCODE, INCREMENT ╨├
2 ╨├ ╥ FETCH ADDRESS'S LOW BYTE TO LATCH, INCREMENT ╨├
3 $0100,╙ ╥
4 $0100,╙ ╫ PUSH ╨├╚ ON STACK, DECREMENT ╙
5 $0100,╙ ╫ PUSH ╨├╠ ON STACK, DECREMENT ╙
6 ╨├ ╥ COPY LATCH TO ╨├╠, FETCH ADDRESS'S HIGH BYTE TO
LATCH, COPY LATCH TO ╨├╚
╥╘╙
# ADDRESS ╥/╫ DESCRIPTION
--- ------- --- -----------------------------------------------
1 ╨├ ╥ FETCH OPCODE, INCREMENT ╨├
2 ╨├ ╥ READ NEXT INSTRUCTION BYTE (AND THROW IT AWAY),
INCREMENT ╨├
3 $0100,╙ ╥ INCREMENT ╙
4 $0100,╙ ╥ PULL ╨├╠ FROM STACK, INCREMENT ╙
5 $0100,╙ ╥ PULL ╨├╚ FROM STACK
6 ╨├ ╥ INCREMENT ╨├
┬╥╦
# ADDRESS ╥/╫ DESCRIPTION
--- ------- --- -----------------------------------------------
1 ╨├ ╥ FETCH OPCODE, INCREMENT ╨├
2 ╨├ ╥ READ NEXT INSTRUCTION BYTE (AND THROW IT AWAY),
INCREMENT ╨├
3 $0100,╙ ╫ PUSH ╨├╚ ON STACK, DECREMENT ╙
4 $0100,╙ ╫ PUSH ╨├╠ ON STACK, DECREMENT ╙
5 $0100,╙ ╫ PUSH ╨ ON STACK (WITH ┬ FLAG SET), DECREMENT ╙,
SET ╔ FLAG
6 $╞╞╞┼ ╥ FETCH ╨├╠
7 $╞╞╞╞ ╥ FETCH ╨├╚
╥╘╔
# ADDRESS ╥/╫ DESCRIPTION
--- ------- --- -----------------------------------------------
1 ╨├ ╥ FETCH OPCODE, INCREMENT ╨├
2 ╨├ ╥ READ NEXT INSTRUCTION BYTE (AND THROW IT AWAY),
INCREMENT ╨├
3 $0100,╙ ╥ INCREMENT ╙
4 $0100,╙ ╥ PULL ╨ FROM STACK, INCREMENT ╙
5 $0100,╙ ╥ PULL ╨├╠ FROM STACK, INCREMENT ╙
6 $0100,╙ ╥ PULL ╨├╚ FROM STACK
╨╚┴, ╨╚╨
# ADDRESS ╥/╫ DESCRIPTION
--- ------- --- -----------------------------------------------
1 ╨├ ╥ FETCH OPCODE, INCREMENT ╨├
2 ╨├ ╥ READ NEXT INSTRUCTION BYTE (AND THROW IT AWAY),
INCREMENT ╨├
3 $0100,╙ ╫ PUSH REGISTER ON STACK, DECREMENT ╙
╨╠┴, ╨╠╨
# ADDRESS ╥/╫ DESCRIPTION
--- ------- --- -----------------------------------------------
1 ╨├ ╥ FETCH OPCODE, INCREMENT ╨├
2 ╨├ ╥ READ NEXT INSTRUCTION BYTE (AND THROW IT AWAY),
INCREMENT ╨├
3 $0100,╙ ╥ INCREMENT ╙
4 $0100,╙ ╥ PULL REGISTER FROM STACK
╘HE EXAMPLE PROGRAM CONSISTS OF THREE PARTS. ╘HE FIRST PART
TRANSFERS THE OTHER PARTS TO APPROPRIATE MEMORY AREAS. ╘HE SECOND PART
IS LOCATED IN STACK AREA (300-312), AND IT INVOKES THE THIRD PART, THE
MAIN MODULE.
╘HE LOADER PART ($0801-$08├7) IS AS FOLLOWS:
1993 ╙┘╙2061
080─ ╙┼╔ ─ISABLE INTERRUPTS.
080┼ ╠─┴ $01
0810 ╨╚┴ ╙TORE THE STATE OF THE PROCESSOR'S ╔/╧ LINES.
0811 ┴╬─ #$╞8
0813 ╙╘┴ $01 ╙ELECT 64 K┬ ╥┴═ MEMORY CONFIGURATION.
0815 ╠─╪ #$0├ ├OPY THE INVOKING PART TO 300-312.
0817 ╠─┴ $0830,╪
081┴ ╙╘┴ $012├,╪
081─ ─┼╪
081┼ ┬╨╠ $0817
0820 ╠─╪ #$8┬ ├OPY THE MAIN PART TO $──64-$──┼┼.
0822 ╠─┴ $083├,╪
0825 ╙╘┴ $──63,╪
0828 ─┼╪
0829 ┬╬┼ $0822
082┬ ╨╠┴ ╥ESTORE ORIGINAL MEMORY CONFIGURATION.
082├ ╙╘┴ $01
082┼ ├╠╔ ┼NABLE INTERRUPTS.
082╞ ╥╘╙ ╥ETURN.
╘HE USER INVOKES THE FOLLOWING PART BY ISSUING ╙┘╙ 300. ╘HIS PART
CHANGES THE MEMORY CONFIGURATION AND JUMPS TO THE MAIN PART.
012├ ╠─┴ $01
012┼ ╘┴╪ ╙TORE ORIGINAL MEMORY CONFIGURATION TO ╪ REGISTER.
012╞ ┴╬─ #$╞8
0131 ╧╥┴ #$04
0133 ╙┼╔ ─ISABLE INTERRUPTS.
0134 ╙╘┴ $01 ╙ELECT 64 K┬ ╥┴═ MEMORY CONFIGURATION.
0136 ╩═╨ $──┴4 ╩UMP TO THE MAIN PART.
╘HE MAIN PART ACTUALLY CONSISTS OF TWO PARTS. ╔T MAY BE A BIT
COMPLICATED, AND IT MIGHT TEACH NEW TRICKS TO YOU.
──┴4 ╘╪┴
──┴5 ╨╚┴ ╨USH ORIGINAL MEMORY CONFIGURATION ON STACK.
──┴6 ╠─┴ $╞╞╞┴
──┴9 ╨╚┴
──┴┴ ╠─┴ $╞╞╞┬
──┴─ ╨╚┴ ╙TORE THE ORIGINAL VALUES OF $╞╞╞┴ AND $╞╞╞┬.
──┴┼ ╠─┴ #$16
──┬0 ╙╘┴ $╞╞╞┴ ╙ET ($╞╞╞┴) TO POINT TO ╥╘╔.
──┬3 ╠─┴ #$├0
──┬5 ╙╘┴ $╞╞╞┬
──┬8 ╩╙╥ $───├ ╙WAP THE AUXILIARY ROUTINES IN.
──┬┬ ╩╙╥ $├000 ─ISABLE ╬═╔'S AND INITIALIZE ├╔┴2.
──┬┼ ╨╠┴
──┬╞ ╙╘┴ $╞╞╞┬ ╥ESTORE ORIGINAL VALUES TO $╞╞╞┴ AND $╞╞╞┬.
──├2 ╨╠┴
──├3 ╙╘┴ $╞╞╞┴
──├6 ╩╙╥ $├01─ ╨RINT THE MESSAGE.
──├9 ╩╙╥ $───├ ╙WAP THE AUXILIARY ROUTINES OUT.
──├├ ╨╠┴
──├─ ╘┴┘ ╠OAD ORIGINAL MEMORY CONFIGURATION TO ┘ REGISTER.
──├┼ ╠─┴ #$00 ╨USH DESIRED STACK REGISTER VALUE ON STACK
───0 ╨╚┴ (CLEAR ALL FLAGS, ESPECIALLY THE ╔ FLAG).
───1 ╘╙╪
───2 ╔╬├ $0102,╪ ╔NCREMENT THE RETURN ADDRESS.
───5 ┬╬┼ $───┴ (╥╘╙ PREINCREMENTS IT, BUT ╥╘╔ DOES NOT.)
───7 ╔╬├ $0103,╪
───┴ ╙╘┘ $01 ╥ESTORE ORIGINAL MEMORY CONFIGURATION.
(╘HE 6510 FETCHES THE NEXT INSTRUCTION FROM $───├, WHICH IS NOW
CONNECTED TO THE ├╔┴2'S REGISTER $├, THE ╙ERIAL ╨ORT REGISTER.
╘HE INITIALIZATION ROUTINE WROTE AN ╥╘╔ TO IT. ╘HE PROCESSOR ALSO
READS FROM $──── AS A SIDE EFFECT OF THE INSTRUCTION FETCH,
THUS RE-ENABLING ╬═╔'S.)
───├ ╠─┘ #$3╞ ╙UBROUTINE: ╙WAP THE MEMORY AREAS $├000-$├03╞
───┼ ╠─╪ $├000,┘ AND $──64-$──┴3 WITH EACH OTHER.
──┼1 ╠─┴ $──64,┘
──┼4 ╙╘┴ $├000,┘
──┼7 ╘╪┴
──┼8 ╙╘┴ $──64,┘
──┼┬ ─┼┘
──┼├ ┬╨╠ $───┼
──┼┼ ╥╘╙
├000 ╔╬├ $01 ┼NABLE THE ╔/╧ AREA.
├002 ╠─╪ #$81
├004 ╙╘╪ $──0─ ┼NABLE ╘IMER ┴ INTERRUPTS OF ├╔┴2.
├007 ╠─╪ #$00
├009 ╙╘╪ $──05
├00├ ╔╬╪
├00─ ╙╘╪ $──04 ╨REPARE ╘IMER ┴ TO COUNT FROM 1 TO 0.
├010 ╠─╪ #$──
├012 ╙╘╪ $──0┼ ├AUSE AN INTERRUPT.
(╘HE INSTRUCTION SETS ╙╨ TO OUTPUT, MAKES ╘IMER ┴ TO COUNT
SYSTEM CLOCK PULSES, FORCES THE ├╔┴ TO LOAD THE INITIAL VALUE
TO THE COUNTER, SELECTS ONE-SHOT COUNTING AND STARTS THE TIMER.)
├015 ╠─╪ #$40
(╘HE PROCESSOR NOW JUMPS TO THE ╬═╔ HANDLER ($├016), AND
THE ╙╨ REGISTER STARTS TO ACT AS A MEMORY PLACE.)
├017 ╙╘╪ $──0├ ╫RITE AN ╥╘╔ TO ╙ERIAL ╨ORT REGISTER.
├01┴ ─┼├ $01 ─ISABLE THE ╔/╧ AREA.
├01├ ╥╘╙ ╥ETURN.
├01─ ╠─┴ $01
├01╞ ╨╚┴
├020 ╧╥┴ #$03 ┼NABLE ╔/╧ AND ╥╧═S.
├022 ╙╘┴ $01
├024 ╠─┘ #$0├ ╨RINT THE MESSAGE.
├026 ╠─┴ $├033,┘
├029 ╩╙╥ $╞╞─2
├02├ ─┼┘
├02─ ┬╨╠ $├026
├02╞ ╨╠┴
├030 ╙╘┴ $01 ╥ESTORE THE 64 K┬ MEMORY CONFIGURATION.
├032 ╥╘╙
├033 "!─╠╥╧╫ ,╧╠╠┼╚"
(╘HE STRING IS BACKWARDS IN MEMORY, SINCE ╔ DON'T WANT TO
WASTE CYCLES IN EXPLICIT COMPARISONS. ╘HIS METHOD RESULTS IN
MORE READABLE CODE THAN DOING A FORWARD LOOP WITH AN INDEX
VALUE $100-(NUMBER OF CHARACTERS).)
╘HIS PROGRAM IS NOT EXCELLENT. ╔T HAS THE FOLLOWING BUGS:
O ╘HE 6510'S MEMORY MANAGEMENT LINES ╨0 AND ╨1 (╠╧╥┴═ AND ╚╔╥┴═,
RESPECTIVELY) ARE ASSUMED TO BE OUTPUTS. ╔F YOU ISSUED THE
COMMAND ╨╧╦┼0,╨┼┼╦(0)┴╬─252, THIS PROGRAM WOULD NOT WORK.
╘HIS COULD BE EASILY CORRECTED BY SETTING THE ╨0 AND ╨1 LINES
TO OUTPUT IN THE BEGINNING OF THE INTERFACING ROUTINE (300 - 312):
╠─┴ $00
╧╥┴ #$02
╙╘┴ $00
O ╘HE PROGRAM DOES NOT RESTORE THE ORIGINAL STATE OF THE ├╔┴2
├ONTROL ╥EGISTER ┴ OR ╔NTERRUPT ├ONTROL ╥EGISTER. ╔T MIGHT BE
IMPOSSIBLE TO START USING THE ╦ERNAL'S ╥╙-232 ROUTINES AFTER
RUNNING THIS.
O ╔F THE USER REDIRECTED OUTPUT TO CASSETTE OR ╥╙-232, INTERRUPTS
WOULD BE REQUIRED. ╚OWEVER, THEY ARE COMPLETELY DISABLED.
O ╔F A NON-MASKABLE INTERRUPT OCCURS WHILE THE LOADER PART IS BEING
EXECUTED, THE PROGRAM WILL SCREW UP. ╘HIS WILL HAPPEN ALSO IN THE
MAIN PART, IF AN ╬═╔ IS ISSUED AFTER DISABLING ╥╧═S AND ╔/╧ IN
$0134 BUT BEFORE EXCHANGING THE CONTENTS OF THE MEMORY PLACES
$├016 AND $──7┴.
_╞REEZER CARTRIDGES_
╘HERE ARE MANY CARTRIDGES THAT LET YOU TO STOP ALMOST ANY PROGRAM FOR
"BACK-UP" PURPOSES. ╧NE OF THE MOST POPULAR OF THESE FREEZER
CARTRIDGES IS THE ┴CTION ╥EPLAY ╓╔ MADE BY ─ATEL ┼LECTRONICS BACK IN
1989. ╘HE CARTRIDGE HAS 8 KILOBYTES ╥┴═ AND 32 KILOBYTES ╥╧═ ON BOARD,
AND IT HAS A CUSTOM CHIP FOR FIDDLING WITH THE ├64 CARTRIDGE PORT
LINES -┼╪╥╧═, -╟┴═┼, -╔╥╤, -╬═╔ AND ┬┴.
╔F THE -╬═╔ LINE IS NOT ASSERTED (THE ╬═╔ INTERRUPTS ARE ENABLED), ALL
FREEZER CARTRIDGES SHOULD BE ABLE TO HALT ANY PROGRAM. ╫HEN THE USER
PRESSES THE "FREEZE" BUTTON, THE CARTRIDGES HALT THE PROCESSOR BY
DROPPING THE ┬┴ LINE LOW. ╘HEN THEY SWITCH SOME OF THEIR OWN ╥╧═ TO
THE $┼000 - $╞╞╞╞ BLOCK BY SELECTING THE ╒LTI═AX CONFIGURATION WITH
THE -┼╪╥╧═ AND -╟┴═┼ LINES. ┴FTER THIS, THEY ASSERT THE -╬═╔ LINE AND
RELEASE THE ┬┴ LINE. ┴FTER COMPLETING THE CURRENT INSTRUCTION, THE
PROCESSOR WILL TAKE THE ╬═╔ INTERRUPT AND LOAD THE PROGRAM COUNTER
FROM THE VECTOR AT $╞╞╞┴, PROVIDED THAT THE ╬═╔ LINE WAS NOT ASSERTED
ALREADY.
╘HIS APPROACH IS PRONE TO MANY FLAWS. ╞IRSTLY, IF THE PROCESSOR IS
EXECUTING A WRITE INSTRUCTION WHEN THE PROGRAM IS BEING HALTED, AND IF
THE WRITE OCCURRED OUTSIDE THE AREA $0000 - $0╞╞╞, THE DATA WOULD GET
LOST, IF THE ╒LTI═AX CONFIGURATION WAS ASSERTED TOO EARLY. ╘HIS CAN BE
CORRECTED TO SOME EXTENT BY WAITING AT LEAST TWO CYCLES AFTER
ASSERTING THE ┬┴ LINE, AS THE PROCESSOR WILL NOT STOP DURING WRITE
CYCLES. ╚OWEVER, THIS IS OF NO HELP IF THE PROCESSOR HAS NOT GOTTEN TO
THE WRITE STAGE YET.
╙ECONDLY, IF THE INSTRUCTION BEING EXECUTED IS OUTSIDE THE AREA
$0000 - $0╞╞╞, OR IF IT ACCESSES ANY DATA OUTSIDE THAT AREA, THE
PROCESSOR WILL FETCH EITHER WRONG PARAMETERS OR INCORRECT DATA, OR
BOTH. ╔F THE INSTRUCTION DOES NOT WRITE ANYTHING, WILL ONLY CORRUPT
ONE PROCESSOR REGISTER.
╘HIRDLY, IF THE ╬═╔ INTERRUPTS ARE DISABLED, PRESSING THE "FREEZE"
BUTTON DOES NOT HAVE ANY OTHER IMMEDIATE EFFECT THAN LEAVING THE
╒LTI═AX MODE ASSERTED, WHICH MAKES ANY SYSTEM ╥┴═ OUTSIDE THE AREA
$0000 - $0╞╞╞ UNAVAILABLE. ╔T ALSO FORCES THE ╔/╧ AREA ($─000 - $─╞╞╞)
ON. ╔F THE PROGRAM HAS ANY INSTRUCTIONS OR DATA OUTSIDE THE LOWMOST
FOUR KILOBYTES, IT WILL EVENTUALLY JAM, AS THAT DATA WILL BE SOMETHING
ELSE THAN THE PROGRAM EXPECTS.
╧NE MIGHT EXCEPT THAT READING FROM OPEN ADDRESS SPACE SHOULD RETURN
RANDOM BYTES. ┬UT, IN AT LEAST TWO ├64'S, THE BYTES READ ARE MOSTLY
$┬─, WHICH IS THE OPCODE FOR ╠─┴ ABSOLUTE,╪. ╙O, IF THE PROCESSOR HAS
A "GOOD LUCK", IT WILL HAPPILY EXECUTE ONLY ╠─┴ $┬─┬─,╪ COMMANDS, AND
IT MIGHT SURVIVE TO THE CARTRIDGE ╥╧═ AREA WITHOUT JAMMING. ╧R IT
COULD EVENTUALLY FETCH A ┬╥╦ AND JUMP TO THE CARTRIDGE ╥╧═ VIA THE
╔╥╤/┬╥╦ VECTOR AT $╞╞╞┼. ╘HE ┴CTION ╥EPLAY ╓╔ HAS THE FAMILIAR
AUTOSTART DATA IN THE BEGINNING OF BOTH THE ╥╧═╠ AND ╥╧═╚ BLOCKS BY
DEFAULT, AND THAT DATA COULD BE INTERPRETED AS SENSIBLE COMMANDS. ╘HE
┴CTION ╥EPLAY ╓╔ WAS INDEED ABLE TO FREEZE MY TEST PROGRAM, EVEN
THOUGH ╔ HAD COVERED ITS -╥┼╙┼╘, -╔╥╤ AND -╬═╔ LINES WITH A PIECE OF
TAPE, UNTIL ╔ RELOCATED THE PROGRAM TO THE FIRST 4 KILOBYTE BLOCK.
_┬UILDING AN UNBEATABLE FREEZER CIRCUIT_
┴S YOU CAN SEE, IT IS TOTALLY IMPOSSIBLE TO DESIGN A FREEZER CARTRIDGE
THAT FREEZES ANY PROGRAM. ╔F THE PROGRAM TO BE FREEZED HAS DISABLED
THE ╬═╔ INTERRUPTS, AND IF ITS CODE RUNS MOSTLY AT $0000 - $0╞╞╞ OR
$─000 - $─╞╞╞, THE COMPUTER WILL MORE PROBABLY HANG THAN SUCCEED IN
FREEZING THE PROGRAM.
╚OWEVER, IT IS POSSIBLE TO MAKE SOME INTERNAL MODIFICATIONS TO A ├64,
SO THAT IT CAN FREEZE LITERALLY ANY PROGRAM. ┘OU NEED TO EXPAND YOUR
MACHINE TO 256 KILOBYTES FOLLOWING THE DOCUMENTS ON FTP.FUNET.FI IN
THE /PUB/CBM/HARDWARE/256K┬ DIRECTORY. ╔T WILL LET YOU TO RESET THE
COMPUTER SO THAT ALL OF THE 64 KILOBYTES THE PREVIOUS PROGRAM USED,
WILL REMAIN INTACT. ╔F YOU ADD A SWITCH TO ONE OF THE MEMORY EXPANSION
CONTROLLER'S CHIP SELECTION LINES, THE PROGRAM BEING EXAMINED WILL
HAVE NO WAY TO SCREW THE MACHINE UP, AS THE ADDITIONAL MEMORY MANAGEMENT
REGISTERS WILL NOT BE AVAILABLE.
┴ FEW ENHANCEMENTS TO THIS CIRCUIT ARE REQUIRED SO THAT YOU CAN FREEZE
THE PROGRAMS WITHOUT LOSING THE STATE OF THE ╔/╧ CHIPS. ┘OU WILL ALSO
NEED TO REPLACE THE ╦ERNAL ╥╧═ CHIP WITH YOUR OWN CODE, IF YOU DO NOT
WANT TO LOSE THE STATE OF THE ┴, ╪, ╨ AND ╙ REGISTERS. ╒NFORTUNATELY
THIS CIRCUIT WILL NOT PRESERVE THE STATE OF THE PROCESSOR'S ╨ERIPHERAL
LINES (ITS BUILT-IN ╔/╧ PORT MAPPED TO THE MEMORY ADDRESSES 0 AND 1),
NOR DOES IT RECORD THE PROGRAM COUNTER (╨├). ╔ HAVE A PARTIAL SOLUTION
TO THE ╨├ PROBLEM, THOUGH.
╔F YOU ARE INTERESTED IN THIS PROJECT, CONTACT ME. ╔ WILL DESIGN THE
ADDITIONAL HARDWARE, AND ╔ WILL PROGRAM THE STARTUP ROUTINES, BUT ╔
CERTAINLY DO NOT HAVE THE TIME TO PROGRAM ALL OF THE FREEZER SOFTWARE.
═OST OF THE FREEZER SOFTWARE COULD BE IN ╥┴═, SO IT WOULD BE VERY EASY
TO DEVELOP IT, AND YOU COULD EVEN USE EXISTING TOOLS BY PATCHING THEM
SLIGHTLY.
=============================================================================
╞╠─ - ╙CROLLING THE SCREEN
BY ═AREK ╦LAMPAR (KLAMPAR@ELF.STUBA.SK)
╙CROLLING THE SCREEN
--------------------
[INSPIRATED BY ╨ASI ╧JALA ARTICLE '╧PENING THE BORDERS' FROM ISSUE#6]
╞ROM ╨ASI '┴LBERT' ╧JALA'S (PO87553@CS.TUT.FI OR ALBERT@CC.TUT.FI) ARTICLE:
_╙CROLLING THE SCREEN_
╓╔├ BEGINS TO DRAW THE SCREEN FROM THE FIRST BAD LINE. ╓╔├ WILL KNOW
WHAT LINE IS A BAD LINE BY COMPARING ITS SCAN LINE COUNTER TO THE
VERTICAL SCROLL REGISTER : WHEN THEY MATCH, THE NEXT LINE IS A BAD
LINE. ╔F WE CHANGE THE VERTICAL SCROLL REGISTER ($D011), THE FIRST BAD
LINE WILL MOVE ALSO. ╔F WE DO THIS ON EVERY LINE, THE LINE COUNTER IN
╓╔├ WILL NEVER MATCH WITH IT AND THE DRAWING NEVER STARTS (UNTIL IT IS
ALLOWED TO DO SO).
╫HEN WE DON'T HAVE TO WORRY ABOUT BAD LINES, WE HAVE ENOUGH TIME TO
OPEN THE BORDERS AND DO SOME OTHER EFFECTS TOO. ╔T IS NOT NECASSARY TO
CHANGE THE VERTICAL SCROLL ON EVERY LINE TO GET RID OF THE BAD LINES,
JUST MAKE SURE THAT IT NEVER MATCHES THE LINE COUNTER (OR ACTUALLY THE
LEAST SIGNIFICANT 3 BITS).
┘OU CAN EVEN SCROLL THE BAD LINES INDEPENDENTLY AND YOU HAVE ╞╠─ -
╞LEXIBLE ╠INE ─ISTANCE. ┘OU JUST ALLOW A BAD LINE WHEN IT IS TIME TO
DISPLAY THE NEXT CHARACTER ROW. ╫ITH THIS YOU CAN BOUNCE THE LINES OR
SCROLL A HIRES PICTURE VERY FAST DOWN THE SCREEN.
(*** END OF ┴LBERT'S PARAGRAPH ***)
╫ELL, EVERYTHING IMPORTANT WAS WRITTEN. ╔'M JUST ADDING THIS:
╞OR MOVING HIRES PICTURE REPLACE ╧╥┴ #$10 BY ╧╥┴ #$30.
╞OR ANOTHER ╞╪ TRY TO REPLACE PART OF IRQ ROUTINE BEGINING WITH ╧╥┴ #$10 BY:
╧╥┴ #$├0
╙╘┴ $─016,
REMOVE ╩╙╥ ├╚╧╞╙,
REPLACE ╠─╪ ╧╞╙┼╘
BY ╠─╪ #$FF
AND ENJOY =)
╘HE DEMONSTARTION PROGRAM FOR ╞╠─ APPLICATION
;---------------------------------------
; ├OMMODORE ├RACKER 1993
;---------------------------------------
╞╥╧═ = $32
╘╧ = $╞┴
;---------------------------------------
*= $├000
;---------------------------------------
╔╬╔╘ ╠─┴ #0
╙╘┴ ─╔╥ ; ─IRECTION
╠─┴ #$╞╞ ; ╙ET GARBAGE
╙╘┴ $3╞╞╞
╠─┴ #╞╥╧═
╙╘┴ ╧╞╙┼╘ ; ╙ET OFSET
╙┼╔ ; ─ISABLE INTERRUPT
╠─┴ #$7╞ ; ─ISABLE TIMER INTERRUPT
╙╘┴ $─├0─
╠─┴ #1 ; ┼NABLE RASTER INTERRUPT
╙╘┴ $─01┴
╠─┴ #<╔╥╤ ; ╙ET IRQ VECTOR
╙╘┴ $0314
╠─┴ #>╔╥╤
╙╘┴ $0315
╠─┴ #0 ; ╘O EVOKE OUR IRQ ROUTINE ON 0TH LINE
╙╘┴ $─012
├╠╔ ; ┼NABLE INTERRUPT
╥╘╙
;---------------------------------------
╔╥╤ ╠─╪ ╧╞╙┼╘
╠2 ╠─┘ $─012 ; ═OVING 1ST BAD LINE
╠1 ├╨┘ $─012
┬┼╤ ╠1 ; ╫AIT FOR BEGIN OF NEXT LINE
─┼┘ ; ╔┘ - BAD LINE
╘┘┴
┴╬─ #$07 ; ├LEAR HIGHER 5 BITS
╧╥┴ #$10 ; ╙ET TEXT MODE
╙╘┴ $─011
─┼╪
┬╬┼ ╠2
╔╬├ $─019 ; ┴CKNOWLEDGE THE RASTER INTERRUPT
╩╙╥ ├╚╧╞╙
╩═╨ $┼┴31 ; ─O STANDARD IRQ ROUTINE
;---------------------------------------
╧╞╙┼╘ .┬┘╘┼ ╞╥╧═
─╔╥ .┬┘╘┼ 0
;---------------------------------------
├╚╧╞╙ ╠─┴ ─╔╥ ; ├HANGE ╧╞╙┼╘ OF SCREEN
┬╬┼ ╒╨
╔╬├ ╧╞╙┼╘ ; ─OWN
╠─┴ ╧╞╙┼╘
├═╨ #╘╧
┬╬┼ ╙╦╔╨
╙╘┴ ─╔╥
╙╦╔╨ ╥╘╙
;---------------------------------------
╒╨ ─┼├ ╧╞╙┼╘ ; ╒P
╠─┴ ╧╞╙┼╘
├═╨ #╞╥╧═
┬╬┼ ╙╦╔╨
╠─┴ #0
╙╘┴ ─╔╥
╥╘╙
=============================================================================
╘ECH-TECH - MORE RESOLUTION TO VERTICAL SHIFT.
BY ╨ASI '┴LBERT' ╧JALA (PO87553@CS.TUT.FI _OR_ ALBERT@CC.TUT.FI)
╫RITTEN ON 16-═AY-91 ╘RANSLATION 02-╩UN-92
(┴LL TIMINGS ARE IN ╨┴╠, PRINCIPLES WILL APPLY TO ╬╘╙├ TOO)
╧NE TIME HALF OF THE DEMOS HAD PICTURES WAVING HORIZONTALLY ON THE
WIDTH OF THE WHOLE SCREEN. ╘HIS EFFECT IS NAMED TECH-TECH, AND THE
AUDIENCE WAS PUZZLED. ┘OU CAN MOVE THE SCREEN ONLY EIGHT PIXELS USING
THE HORIZONTAL SCROLL REGISTER. ╘HIS EFFECT WAS DONE USING CHARACTER
GRAPHICS. ╚OW EXACTLY AND IS THE SAME POSSIBLE WITH SPRITES ?
╚ORIZONTAL SCROLL REGISTER CAN MOVE THE SCREEN BY EIGHT PIXELS. ╘HIS
ISN'T EVEN NEARLY ENOUGH TO PRODUCE A REALLY STUNNING EFFECT. ┘OU HAVE
TO MOVE THE GRAPHICS ITSELF, FORTUNATELY WITH A RESOLUTION OF ONE
CHARACTER POSITION (ONE BYTE) ONLY, THE REST CAN BE DONE WITH THE SCROLL
REGISTER. ─URING ONE SCAN LINE THERE IS NO TIME TO MOVE THE ACTUAL DATA,
YOU CAN ONLY MOVE A POINTER. ├HANGING THE VIDEO MATRIX POINTER WON'T
HELP, BECAUSE ╓╔├ (VIDEO INTERFACE CONTROLLER) WILL FETCH THE CHARACTER
CODES ONLY AT CERTAIN TIMES, CALLED BAD LINES. ┘OU CAN CHANGE THE
CHARACTER SET POINTER INSTEAD, BECAUSE ╓╔├ READS THE DATA IT DISPLAYS
DIRECTLY FROM THE CHARACTER SET MEMORY.
├HARACTER SET-IMPLEMENTATION HAS ITS RESTRICTIONS
┬ECAUSE HORIZONTAL MOVEMENT IS DONE BY CHANGING THE CHARACTER SETS, THE
PICTURE OR TEXT MUST BE PURE GRAPHIC AND THE CHARACTER CODES IN THE
VIDEO MATRIX MUST BE IN A NUMERICAL ORDER. ╘HE NORMAL PICTURE IS IN THE
FIRST CHARACTER MEMORY AND IN THE NEXT ONE IT IS SHIFTED ONE CHARACTER
POSITION TO THE RIGHT. ╧NE VIDEO BANK CAN HOLD ONLY SEVEN FULL CHARACTER
MEMORIES BESIDES THE VIDEO MATRIX. ╘HIS LIMITS THE MOVEMENT OF THE
PICTURE TO 56 PIXELS. ╔T IS POSSIBLE TO GET MORE MOVEMENT IF YOU USE
SMALLER PICTURE OR ANOTHER VIDEO BANK.
╘HE SHIFT IS DONE SO THAT ON EACH SCAN LINE WE UPDATE THE HORIZONTAL
SCROLL REGISTER ($─016) WITH THE THREE LOWEST BITS OF THE SHIFT VALUE.
╫E USE THE OTHER BITS TO SELECT THE RIGHT CHARACTER SET ($─018). ╔N A
TECH-TECH THE SHIFT VALUE CHANGES DURING THE DISPLAY OF THE WHOLE
PICTURE, AND THE VALUES ARE STORED IN A TABLE. ╔N ADDITION TO THAT, THE
SHIFT VALUES SHOULD BE PUT INTO TWO TABLES, ONE FOR THE HORIZONTAL
SCROLL REGISTER AND ANOTHER FOR THE CHARACTER SET SELECT. ╘HIS IS
NECESSARY, BECAUSE THERE IS NO TIME FOR EXTRA CALCULATIONS ON A BAD
LINE.
┬ECAUSE WE HAVE TO CHANGE THE CHARACTER SET AND X-SCROLL DYNAMICALLY, WE
ALSO NEED A RASTER ROUTINE TO SHOW A TECH-TECH. ┴ RASTER ROUTINE IS A
ROUTINE WHICH IS SYNCHRONIZED TO THE ELECTRON BEAM. ╘HIS EATS UP THE
PROCESSOR TIME: THE BIGGER THE PICTURE, THE LESS TIME IS LEFT OVER FOR
OTHER ACTIVITIES. ╧N OTHER THAN BAD LINES YOU CAN DO OTHER FUNNY THINGS,
LIKE CHANGE THE COLOR OF THE BACKGROUND OR BORDER.
┴N EXAMPLE PROGRAM
╘HE DEMO PROGRAM USES VIDEO BANK 2, MEMORY ADDESSES $4000-7FFF. ╘HE
VIDEO MATRIX IS IN THE BEGINNING OF THE BANK. ╧NLY INVERTED CHARS ARE
USED FOR THE GRAPHICS, THIS WAY WE HAVE ALL EIGHT CHARACTER MEMORIES
AVAILABLE AND THE MAXIMUM SHIFT IS 64 PIXELS. ╘HE AREA FOR THE TECH-TECH
IN THE VIDEO MATRIX IS EIGHT CHARACTER ROWS HIGH, BUT IT HAS IDENTICAL
GRAPHICS ON EVERY LINE. ╘HIS IS WHY WE USE ONLY 320 BYTES FROM EACH
CHARACTER SET.
┘OU CAN USE A JOYSTICK TO CONTROL THE MOVEMENT OF THE TECH-TECH. ╘HE
STICK DECREASES OR INCREASES THE SHIFT ADD VALUE IN A RESOLUTION OF A
HALF PIXEL. ╫HEN THE SHIFT REACHES ITS HIGHEST/LOWEST VALUE, THE
DIRECTION OF THE ADD IS REVERSED. ╩UST EXPERIMENT WITH IT.